package com.java.Collection.List.LinkedList;

import java.util.Arrays;
import java.util.LinkedList;

public class LinkedListAPI {
    static class Inner {
        private String name;
        
        public Inner(String name) {
            this.name = name;
        }
        
        @Override
        public String toString() {
            return name;
        }
    }
    
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        Inner inner = new Inner("_");
        
        // add：添加一个对象到集合，返回值表示原集合是否改变
        System.out.println(linkedList.add(inner)); // true
        System.out.println(linkedList.add("B")); // true
        System.out.println(linkedList.add("B")); // true
        System.out.println(linkedList.add("A")); // true
        System.out.println(linkedList); // [_, B, B, A]
        
        // add(index)⭐：添加一个对象到集合指定位置，无返回值
        linkedList.add(3, "C");
        System.out.println(linkedList); // [_, B, B, C, A]
        
        // addFirst & addLast⭐⭐：添加一个对象到集合头部或尾部
        linkedList.addFirst("D");
        linkedList.addLast("E");
        System.out.println(linkedList); // [D, _, B, B, C, A, E]
        
        // addAll：添加多个对象到集合，返回值表示原集合是否改变
        System.out.println(linkedList.addAll(Arrays.asList("B", "B", "F"))); // true
        System.out.println(linkedList); // [D, _, B, B, C, A, E, B, B, F]
        
        // set(index)⭐：设置一个对象到集合指定位置，返回值表示指定位置原对象
        System.out.println(linkedList.set(2, "G")); // B
        System.out.println(linkedList); // [D, _, G, B, C, A, E, B, B, F]
        
        // get(index)⭐：获取集合指定位置的对象，返回值表示指定位置对象
        System.out.println(linkedList.get(2)); // G
        
        // getFirst & getLast⭐⭐：获取集合头部或尾部的对象，返回值表示头部或尾部对象
        System.out.println(linkedList.getFirst()); // D
        System.out.println(linkedList.getLast()); // F
        
        // remove：移除集合内一个指定对象，若指定对象重复则移除第一个，返回值表示原集合是否改变
        System.out.println(linkedList.remove(new Inner("_"))); // false
        System.out.println(linkedList.remove(inner)); // true
        System.out.println(linkedList.remove("B")); // true
        System.out.println(linkedList); // [D, G, C, A, E, B, B, F]
        
        // remove(index)⭐：移除集合内一个指定位置的对象，返回值表示指定位置原对象。注意集合内元素为整数时参数表示索引而非元素
        System.out.println(linkedList.remove(1)); // G
        System.out.println(linkedList); // [D, C, A, E, B, B, F]
        
        // removeFirst & removeLast⭐⭐：移除集合头部或尾部的对象，返回值表示头部或尾部对象
        System.out.println(linkedList.removeFirst()); // D
        System.out.println(linkedList.removeLast()); // F
        System.out.println(linkedList); // [C, A, E, B, B]
        
        // removeAll：移除集合内多个指定对象，返回值表示原集合是否改变
        System.out.println(linkedList.removeAll(Arrays.asList("B", "F"))); // true
        System.out.println(linkedList); // [C, A, E]
        
        // contains：判断集合内是否存在指定对象，重写hashCode和equals可自定义判断方式
        System.out.println(linkedList.contains("A")); // true
        
        // containsAll：判断集合内是否存在所有指定对象，重写hashCode和equals可自定义判断方式
        System.out.println(linkedList.containsAll(Arrays.asList("A", "C"))); // true
        System.out.println(linkedList.containsAll(Arrays.asList("A", "C", "G"))); // false
        
        // retainAll：获取两集合的交集对象，返回值表示原集合是否改变
        System.out.println(new LinkedList<>(Arrays.asList("A", "C")).retainAll(Arrays.asList("B"))); // true
        System.out.println(linkedList.retainAll(Arrays.asList("C", "A", "B"))); // true
        System.out.println(linkedList); // [C, A]
        
        // isEmpty：判断集合内对象个数是否为空
        System.out.println(new LinkedList<>().isEmpty()); // true
        System.out.println(linkedList.isEmpty()); // false
        
        // size：获取集合内对象总数
        System.out.println(new LinkedList<>().size()); // 0
        System.out.println(linkedList.size()); // 2
        
        // toArray：获取集合的数组形式
        System.out.println(linkedList.toArray()); // [Ljava.lang.Object;@1b6d3586
        
        // clear：清空集合内所有对象，无返回值
        linkedList.clear();
        System.out.println(linkedList); // []
    }
}
